#ifndef INIT_PREMUTACION_CU
#define INIT_PREMUTACION_CU

#include "../fitness/fitnessPermutacion.cu"

__global__ void inicializarPoblacionPermutacionManual(int* poblacion, float* fitnessActualDevice, struct Random randomGPU, int cantCromosomasPoblacion, float* fitnessOrdenadoDevice, unsigned long * numerosAleatoriosInicializacion){
	//Obtengo posicion a escribir.
	int posicionCromosoma = threadIdx.y * cantGenesEnCromosomaDevice * 2 + blockIdx.y * totalGenesEnPoblacionDevice;
	int posicionFitness = threadIdx.y * 2 + blockIdx.y * cantCromosomasPoblacionDevice;

	//inicializo la poblacion en -1
	for(int i = 0; i<cantGenesEnCromosomaDevice * 2; i++){
		poblacion[posicionCromosoma+i] = -1;
	}

	for(int i = 0; i<cantGenesEnCromosomaDevice; i++){
		//Genero valor aleatorio.
		unsigned int r = (numerosAleatoriosInicializacion[posicionCromosoma+i] % cantGenesEnCromosomaDevice);
		while(poblacion[posicionCromosoma+r] != -1){
			r = (r+1) % cantGenesEnCromosomaDevice;
		}
		poblacion[posicionCromosoma+r] = i;
	}

	for(int i = 0; i<cantGenesEnCromosomaDevice; i++){
		//Genero valor aleatorio.
		unsigned int r = (numerosAleatoriosInicializacion[posicionCromosoma+cantGenesEnCromosomaDevice+i] % cantGenesEnCromosomaDevice);
		while(poblacion[posicionCromosoma+cantGenesEnCromosomaDevice+r] != -1){
			r = (r+1) % cantGenesEnCromosomaDevice;
		}
		poblacion[posicionCromosoma+cantGenesEnCromosomaDevice+r] = i;
	}

	fitnessActualDevice[posicionFitness] = calcularFitnessPermutacionGPU(poblacion, posicionCromosoma);
	fitnessActualDevice[posicionFitness + 1] = calcularFitnessPermutacionGPU(poblacion, posicionCromosoma + cantGenesEnCromosomaDevice);
	
	fitnessOrdenadoDevice[posicionFitness] = fitnessActualDevice[posicionFitness];
	fitnessOrdenadoDevice[posicionFitness + 1] = fitnessActualDevice[posicionFitness + 1];
}

#endif
